package redis

import (
	"bluebell/models"
	"github.com/go-redis/redis"
	"strconv"
	"time"
)

// GetPostIdsInOrder 按指定排序获取帖子列表id合集
func GetPostIdsInOrder(param *models.ParamPostList) ([]string, error) {
	// 从redis获取id
	key := KeyPostTimeZSet
	if param.Order == "score" {
		key = KeyPostScoreZSet
	}
	// 确定查询索引的起始点
	start := (param.Page - 1) * param.Limit
	end := start + param.Limit - 1
	return rdb.ZRevRange(key, start, end).Result() // 按分数最高顺序排列,取序号start到end的元素Member值合集)
}

// GetPostVoteData 获取指定的id合集的点赞数(保持ids排序)
func GetPostVoteData(ids []string) (data []int64, err error) {
	//data = make([]int64, 0, len(ids))
	//for _, id := range ids {
	//	count := rdb.ZCount(KeyPostVotedZSetPF+id, "1", "1").Val()
	//	data = append(data, count)
	//}
	pipeline := rdb.Pipeline()
	for _, id := range ids {
		pipeline.ZCount(KeyPostVotedZSetPF+id, "1", "1")
	}
	var cmders []redis.Cmder
	cmders, err = pipeline.Exec() // 获取到每次操作的合集
	if err != nil {
		return nil, err
	}
	data = make([]int64, 0, len(cmders))
	for _, cmder := range cmders {
		val := cmder.(*redis.IntCmd).Val() // 每次操作得到的值
		data = append(data, val)
	}
	return
}

// GetCommunityPostIdsInOrder 按社区获取指定的id合集的点赞数(保持ids排序)
func GetCommunityPostIdsInOrder(param *models.ParamCommunityPostList) ([]string, error) {
	orderKey := KeyPostTimeZSet
	if param.Order == "score" {
		orderKey = KeyPostScoreZSet
	}

	// 社区key
	cKey := KeyCommunitySetPF + strconv.Itoa(int(param.CommunityID))

	// 最终交集的key,利用缓存key较少ZInterStore执行次数
	key := orderKey + strconv.Itoa(int(param.CommunityID))
	if rdb.Exists(key).Val() < 1 { // 如果不存在,需要计算
		pipeline := rdb.Pipeline()              // 定义批量执行方法实例
		pipeline.ZInterStore(key, redis.ZStore{ // 取cKey与orderKey的交集生成新的缓存key
			Aggregate: "MAX", // 交集数量最大
		}, cKey, orderKey)
		pipeline.Expire(key, 60*time.Second)       // 设置指定缓存超时时间
		if _, err := pipeline.Exec(); err != nil { // 执行批量方法
			return nil, err
		}
	}
	// 确定查询索引的起始点
	start := (param.Page - 1) * param.Limit
	end := start + param.Limit - 1
	return rdb.ZRevRange(key, start, end).Result()
}
